import { join } from 'path'
import { RollupOptions } from 'rollup'
import { nodeResolve } from '@rollup/plugin-node-resolve'
import commonjs from '@rollup/plugin-commonjs'
import esbuild from 'rollup-plugin-esbuild'
import alias from '@rollup/plugin-alias'
import json from '@rollup/plugin-json'
import copy from 'rollup-plugin-copy'

export default (env = 'production') => {
  const options: RollupOptions = {
    input: join(__dirname, "../src/main/index.ts"),
    output: {
      file: join(__dirname, "../dist/main/_.js"),
      format: "cjs",
      name: "ElectronMainBundle",
      sourcemap: false,
    },
    plugins: [
      nodeResolve({ preferBuiltins: true, browser: true }), // 消除碰到 node.js 模块时⚠警告
      commonjs(),
      json(),
      esbuild({
        // All options are optional
        include: /\.[jt]sx?$/, // default, inferred from `loaders` option
        exclude: /node_modules/, // default
        // watch: process.argv.includes('--watch'), // rollup 中有配置
        sourceMap: false, // default
        minify: process.env.NODE_ENV === "production",
        target: "esnext", // default, or 'es20XX', 'esnext'
        jsxFactory: "React.createElement",
        jsxFragment: "React.Fragment",
        // Like @rollup/plugin-replace
        define: {
          __VERSION__: '"x.y.z"',
        },
        // Add extra loaders
        loaders: {
          // Add .json files support
          // require @rollup/plugin-commonjs
          ".json": "json",
          // Enable JSX in .js files too
          ".js": "jsx",
        },
      }),
      alias({
        entries: [
          { find: "@main", replacement: join(__dirname, "../src/main") },
        ],
      }),
      copy({
        targets: [
          {
            src: join(__dirname, "../src/preload"),
            dest: join(__dirname, "../dist"),
          },
        ],
      }),
    ],
    external: [
      "crypto",
      "assert",
      "fs",
      "util",
      "os",
      "events",
      "child_process",
      "http",
      "https",
      "path",
      "electron",
    ],
  };

  return options
}
